package com.ccnf.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ccnf.core.bean.TokenParams;
import com.ccnf.model.ao.SmsAO;
import com.ccnf.model.entity.*;
import com.ccnf.model.enums.AuthStatusEnum;
import com.ccnf.model.vo.InviRecordVO;
import com.ccnf.model.vo.InvitationVO;
import com.ccnf.model.vo.ReportVO;

import java.util.List;
import java.util.Map;

public interface InvitationService extends IService<Invitation> {

    /**
     * 搜索邀请函列表
     * @param tokenParams 令牌参数
     * @param searchContent 搜索内容
     * @param authStatus 审核状态
     * @param demo 模板类型
     * @return 返回邀请函列表
     */
    List<Invitation> listInvitationBySearch(TokenParams tokenParams, String searchContent, AuthStatusEnum authStatus, Integer demo);

    /**
     * 查询邀请函详细信息
     * @param invitationId 邀请函ID
     * @param tokenParams 令牌参数
     */
    Map<String, Object> findInvitationDetailInfo(Long invitationId, TokenParams tokenParams);

    /**
     * 修改邀请函内容
     * @param inviId 邀请函内容
     * @param invitation 邀请函内容
     */
    void modifyInvitation(Long inviId, Invitation invitation);

    /**
     * 创建邀请函的授权码
     * @param inviId 邀请函ID
     * @param tokenParams
     * @return 授权码
     */
    String createInviAuthCode(Long inviId, TokenParams tokenParams);

    /**
     * 处理用户授权信息
     * @param authCode 微信授权码
     * @param expoId 展会ID
     * @param userId 用户ID
     */
    void handleUserAuth(String authCode, Long expoId, Long userId);

    /**
     * 获取用户的邀请函列表
     * @param tokenParams 令牌参数
     * @return
     */
    List<Invitation> listUserInviByUserId(TokenParams tokenParams);

    /**
     * 查找邀请函和用户关联数据
     * @param inviId 邀请函ID
     * @param tokenParams 令牌参数
     * @return
     */
    InvitationUser findInviUser(Long inviId, TokenParams tokenParams);

    /**
     * 已授权的邀请函列表
     * @param tokenParams 令牌参数
     * @return
     */
    List<Invitation> listAuthInvi(TokenParams tokenParams);

    /**
     * 处理登记邀请函
     * @param invitationRegister
     */
    void registerInvi(InvitationRegister invitationRegister);

    /**
     * 查询邀请函的报表数据
     * @param invitationId 邀请函ID
     * @param dayNum 查看天数
     * @param reportType 报表类型，0：浏览，1：登记，2：收藏，3：转发点击
     * @return
     */
    ReportVO findInvitationReport(Long invitationId, Integer dayNum, Integer reportType);

    /**
     * 录入邀请函信息
     * @param invitation 邀请函信息
     * @param tokenParams 令牌参数
     * @return
     */
    Long saveInvitation(Invitation invitation, TokenParams tokenParams);

    /**
     * 收藏邀请函
     * @param inviId 邀请函ID
     * @param isCollect 是否收藏
     * @param tokenParams
     */
    void collectInvitation(Long inviId, Integer isCollect, TokenParams tokenParams);

    /**
     * 处理邀请函微信转发分享统计
     * @param expoId 展会ID
     * @param shareId 分享ID
     * @param userId 用户ID
     */
    void handleInvitationShare(Long expoId, Long shareId, Long userId);

    /**
     * 查询邀请函的基本信息
     * @param inviId 邀请函ID
     * @return
     */
    Invitation finInvitationBasicInfo(Long inviId);

    /**
     * 发送邀请函邀约短信
     * @param inviId 邀请函ID
     * @param sms 发送短信号码
     * @param tokenParams 令牌参数
     * @return
     */
    List<String> sendInvitationSms(Long inviId, List<SmsAO> sms, TokenParams tokenParams);

    /**
     * 查询单个邀请函报表统计记录
     * @param invitationId 邀请函ID
     * @param recordType 报表类型：0：总，1：每日
     * @return
     */
    InvitationReport findInvitationRecord(Long invitationId, Integer recordType);

    /**
     * 获取用户收藏的邀请函列表
     * @param tokenParams 令牌参数
     * @return
     */
    List<Invitation> listInvitationCollect(TokenParams tokenParams);

    /**
     * 查看邀请函总排名数据
     * @param rankType 排序类型，0：浏览，1：登记，2：收藏，3：转发点击
     * @param tokenParams 令牌参数
     * @return
     */
    List<InvitationVO> listInvitationRecordRank(Integer rankType, TokenParams tokenParams);

    /**
     * 查询全部邀请函的统计数据
     * @param recordType 统计类型，0：总，1：今日
     * @param tokenParams 令牌参数
     * @return
     */
    InviRecordVO findInviCountRecord(Integer recordType, TokenParams tokenParams);

    /**
     * 查询全部邀请函的报表数据
     * @param dayNum 查询天数
     * @param reportType 报表类型，0：浏览，1：登记，2：收藏，3：转发点击
     * @param tokenParams 令牌参数
     * @return
     */
    ReportVO findInviCountReport(Integer dayNum, Integer reportType, TokenParams tokenParams);

    /**
     * 邮箱导出邀请函的报表数据
     * @param tokenParams 令牌参数
     * @param email 导出的邮箱
     * @param inviId 邀请函ID
     */
    void handleInviDataExport(TokenParams tokenParams, String email, Long inviId);

    /**
     * 导入邀请函
     * @param expoId 展会ID
     * @param invitationList
     */
    void batchImportInvi(Long expoId, List<Invitation> invitationList);

    /**
     * 导入邀请函授权手机号信息
     * @param expoId 展会ID
     * @param authorizationList
     */
    void batchImportAuth(Long expoId, List<Authorization> authorizationList);
}